Опис, особливості та документація по командам віртуального
процесору "EnotVM32".

Регістрів 256.
Назви регістрів дві літери від "AA" до "JV". Це так звані довгі назви
регістрів. Ті назви регістрів, які не можуть бути використані, з-за 
того, що є зарезервовані FASM або іншим яким середовищем, до них
додається "_" в кінці назви. В FASM наприклад, це AH_,AL_,AS_,AT_ і.д.
дивіться в файлі Macros.asm.
Існує також короткі назви регістрів для зручності. Від "A" до "Z",
що відповідає довгій назві від "AA" до "AZ".
Також існують регістри зарезервовані під інше.
YA,YB,YC,YD,YE,YF,YG,YH, - зарезервовані для передачі даних при
виклику EXTR (Системна інструкція для виклику розширень).
ZA,ZB,ZC,ZD,ZE,ZF,ZG,ZH - Зарезервовані для повернення даних після 
виклику EXTR.
CMP1,CMP2 - для використання їх в командах порівняння та переходів
процесору "EnotVM32", таких як, GOTOsaIs, GOTOsaNotIs, GOTOsaMoreIs,
GOTOsaLess, GOTOsrIs, GOTOsrNotIs, GOTOsrMoreIs, GOTOsrLess і т.д.
Регістри зберігаються у вигляді масиву RegsDW:array[0..255] of Int32;
(окрім RgESP та RgEIP) і тому у кожного регістра є цифровий ідентифікатор.
Ідентифікатори регістрів, дивіться в Macros.asm.
Також дивіться мнемоніку написання кожної команди, у вигляді макросів.
Коротко A=0 до Z=25,CMP1=254,CMP2=255.
В вихідних файлах ідентифікатори регістрів з додаванням "id" до регістру.
В основному команди емулятору побудовані так, щоб усі операції, що тільки
можливо, виконувались через 32-бітні регістри. 
Арифметичні операції виконуються як знакові (Int32) (Int32=Longint PAS|DELPHI).
Логічні операції працюють на рівні бітів.

Емулятор стартує з адреси 0, тобто при загрузці файлу, - RgEIP:=0.
І програма починає робити. Довжина пам'яті налаштовується cSizeOfRAM. 

Для стеку є окремий масив RAMc:array[0..cSizeOfRAMstack] of Int32;
його довжина налаштовується окремо cSizeOfRAMstack. При початку загрузки
встановлюється RgESP:=cSizeOfRAMstack.
Стек адресує елементи типу Int32 (4 байти). RgESP індексує елементи, а не байти.

Регістри RgESP,RgEIP:Int32, недоступні, як звичайні регістри, тобто
через команди типа MOV.Доступні вони будуть, через ($2A; EXTR).


Опис команд самого процесору.
Значення в опису команд.
Rg1,Rg2 - ід-регістру відповідно "EnotVM32", (значення 0.255)
V - числове 32 бітне значення -2147483648..2147483647

Rg32 - регістр аналог 32 бітного асемблеру (eax,ebx,ecx...)
DWA - (DWord Adress), 32 бітна адреса


Код десятичний; код шістнадцятирічний; Назва макросу (формат)в модулі
Macros.asm який для FASM; довжина команди в байтах;
аналог команди в FASM (можливо приблизний); опис команди.

00; $00; nop_; 1; nop; Пуста команда не виконує ніяких дій.

-----------  команди MOV для 32 бітних регістрів.
На відміну від асемблеру де робота з 32,16 та 8 бітними даними робиться,
через одну команду MOV. В "EnotVM32", це робиться. окремими командами
MOV..., MOV2..., MOV1 відповідно.

01; $01; MOVrv Rg1,V     ; 6 ; mov Rg32,V      ; Присвоює регістру Rg1 значення V.
02; $02; MOVrr Rg1,Rg2   ; 3 ; mov Rg32,Rg32   ; Присвоює регістру Rg1 значення регістру Rg2.	   
03; $03; MOVrm Rg1,DWA1  ; 6 ; mov Rg32,[DWA1] ; Присвоює регістру Rg1, значення, яке знаходиться по адресі DWA1.	   
04; $04; MOVrmr Rg1,Rg2  ; 3 ; mov Rg32,[Rg32] ; Присвоює регістру Rg1, значення, яке знаходиться по адресі регістру Rg2.	   
05; $05; MOVmr DWA1,Rg1  ; 6 ; mov [DWA1],Rg32 ; Присвоює пам'яті з адресою DWA1 значення, регістру Rg1.	   
06; $06; MOVmrr Rg1,Rg2  ; 3 ; mov [Rg32],Rg32 ; Присвоює пам'яті, з адресою в Rg1, значення, регістру Rg2.	   
-----------  команди MOV для 16 бітних регістрів.
07; $07; MOV2rm Rg1,DWA1  ; 6 ; mov Rg32, word [DWA1];  Присвоює регістру Rg1, значення, яке знаходиться по адресі DWA1.	   
08; $08; MOV2mr DWA1,Rg1  ; 6 ; mov [DWA1], word Rg32;  Присвоює пам'яті з адресою DWA1 значення, регістру Rg1.	   
-----------  команди MOV для 8 бітних регістрів.
09; $09; MOV1rm Rg1,DWA1  ; 6 ; mov Rg32, byte [DWA1] ;  Присвоює регістру Rg1, значення, яке знаходиться по адресі DWA1.	   
10; $0A; MOV1mr DWA1,Rg1  ; 6 ; mov [DWA1],byte Rg32 ;  Присвоює пам'яті з адресою DWA1 значення, регістру Rg1.	   


-----------  Команди викликів підпрограм та переходи.

11; $0B; CALLa DWA1       ; 5 ; CALL DWA1      ; Викликає підпрограму по адресі DWA1.
12; $0C; CALLr Rg1        ; 2 ; CALL Rg32      ; Викликає підпрограму по адресі, яка знаходиться в регістрі Rg1.
13; $0D; RET              ; 1 ; RET            ; Повертає з підпрограми.

14; $0E; GOTOa DWA1       ; 5 ; JMP DWA1       ; Безумовний перехід по адресі DWA1.
15; $0F; GOTOr Rg1        ; 2 ; JMP Rg1        ; Безумовний перехід по адресі, значення, якої в регістрі Rg1.

-----------  Умовні переходи.ЗНАКОВІ.
Умовні переходи порівнюють лише регістр CMP1 з регістром CMP2.
Завантажувати дані регістри можна командами присвоєння регістрі
MOV ($01 - $06) або однієї командою CMPrr {$29} можна завантажити відразу 
CMP1 та CMP2. Не забувайте данні порівняння знакові.
Умовні переходи які роблять порівняння CMP1 та CMP2 та перехід.
16; $10; GOTOsaIs DWA1    ; 5 ;if ... then jump; Якщо CMP1=CMP2 то перехід, на адресу DWA1
17; $11; GOTOsaNotIs DWA1 ; 5 ; (дивись вище)  ; Якщо CMP1<>CMP2 то перехід, на адресу DWA1
18; $12; GOTOsaMoreIs DWA1; 5 ; (дивись вище)  ; Якщо CMP1>=CMP2 то перехід, на адресу DWA1
19; $13; GOTOsaLess DWA1  ; 5 ; (дивись вище)  ; Якщо CMP1<CMP2 то перехід, на адресу DWA1
-----
20; $14; GOTOsrIs Rg1     ; 2 ; (дивись вище)  ; Якщо CMP1=CMP2 то перехід, на адресу, яка вказана в Rg1
21; $15; GOTOsrNotIs Rg1  ; 2 ; (дивись вище)  ; Якщо CMP1<>CMP2 то перехід, на адресу, яка вказана в Rg1
22; $16; GOTOsrMoreIs Rg1 ; 2 ; (дивись вище)  ; Якщо CMP1>=CMP2 то перехід, на адресу, яка вказана в Rg1
23; $17; GOTOsrLess Rg1   ; 2 ; (дивись вище)  ; Якщо CMP1<CMP2 то перехід, на адресу, яка вказана в Rg1
Примітка. 
Команди переходів/умовних переходів/викликів підпрограм, такі як CALLa,
GOTOa,GOTOsaIs,GOTOsrNotIs,GOTOsrMoreIs,GOTOsrLess зчитують лише необхідну
кількість байтів з адреси переходів, 2 або 4 байти для
формування адреси переходу в залежності від 16-бітного або 32-бітного
середовища.

-----------  Команди роботи зі стеком.
24; $18; PUSHr Rg1        ; 2 ; PUSH Rg32      ; Переслати значення Rg1 в стек
25; $19; POPr Rg1         ; 2 ; POP Rg32       ; Повернути значення з стеку в Rg1
-----
26; $1A; PUSHrsvr Rg1,Rg2 ; 3 ;                ; Переслати значення регістрів Rg1..Rg2 в стек
27; $1B; POPrsvr  Rg1,Rg2 ; 3 ;                ; Повернути значення в регістри Rg1..Rg2 зі стеку
Примітка. Команди призначені для збереження PUSHrsvr Rg1,Rg2
на початку процедури та відновлення POPrsvr  Rg1,Rg2 їх в кінці процедури,
у разі необхідності.
--------

Арифметичні та логічні команди мають довжину 3 байти (окрім INCr та
DECr, NOT довжина, яких 2 байти) та співпадають з аналогічними командами
FASM, - ADD, SUB, MUL, DIV, MOD, INC, DEC, AND, OR, XOR, NOT, SHL, SHR.
 
Арифметичні та логічні команди працюють лише з 32 бітними регістрами.
 
28; $1C; ADDrr     29; $1D; SUBrr      30; $1E; MULrr     31; $1F; DIVrr
32; $20; MODrr     33; $21; INCrr      34; $22; DECrr     35; $23; ANDrr
36; $24; ORrr      37; $25; XORrr      38; $26; NOTrr     39; $27; SHLrr
40; $28; SHRrr  

41; $29; CMPrr Rg1,Rg2   ; 3 ; CMP Rg32,Rg32   ; по суті дві загрузки регістрів CMP1 та CMP2 однієї командою (MOVrr CMP1,Rg1 MOVrr CMP2,Rg2) для подальшого порівняння та переходу, командами умовних переходів GOTO..($10 - $17)

42; $2A; EXTR WV ; EXTR word value ; 3 ;                 ; Системна інструкція для виклику розширень (BIOS/INT-подібний механізм) (див. док по EXTR)
  
43; $2B; MOV2rmr Rg1,Rg2  ; 3 ; mov Rg32, word [Rg32] ; Присвоює регістру Rg1, значення, яке знаходиться по адресі регістру Rg2.	   
44; $2C; MOV2mrr Rg1,Rg2  ; 3 ; mov [Rg32],word Rg32 ; Присвоює пам'яті, з адресою в Rg1, значення, регістру Rg2.	   
45; $2D; MOV1rmr Rg1,Rg2  ; 3 ; mov Rg32,byte[Rg32] ; Присвоює регістру Rg1, значення, яке знаходиться по адресі регістру Rg2.	   
46; $2E; MOV1mrr Rg1,Rg2  ; 3 ; mov [Rg32], byte Rg32 ; Присвоює пам'яті, з адресою в Rg1, значення, регістру Rg2.	   










